小编典典

当 "" == s 为假但 "".equals(s) 为真时

all

编辑 感谢您的及时回复。请看看真正的问题是什么。这次我把它变得大胆了。

我确实理解 == 和 .equals 之间的区别。所以,这不是我的问题(我实际上为此添加了一些上下文)


我正在对空字符串执行以下验证:

if( "" == value ) { 
    // is empty string 
} 

过去数据库中获取值或从另一个节点反序列化对象时,此测试失败,因为两个字符串实例确实是不同的对象引用,尽管它们包含相同的数据。

所以解决这些情况的方法是

if( "".equals( value ) ) {
   // which returns true for all the empty strings
}

我很好。这很清楚。

今天再次发生这种情况,但让我感到困惑,因为这次应用程序是一个非常小的独立应用程序,根本不使用网络,所以没有从数据库中获取新字符串,也没有从另一个节点反序列化。

所以问题是:

其他情况下:

"" == value // yields false 

"".equals( value ) // yields true

对于本地独立应用程序?

我很确定代码中没有使用new String() 。

字符串引用可能是“”的唯一方法是因为它是直接在代码中分配的“”(或者这就是我的想法),例如:

String a = "";
String b = a;

assert "" == b ; // this is true 

不知何故(在阅读了更多代码之后,我有了一个线索)创建了两个不同的空字符串对象引用,我想知道如何

jjnguys 回答中的更多内容:

字节!

编辑:结论

我找到了原因。

在 jjnguy 建议之后,我能够以不同的眼光看待代码。

有罪的方法:StringBuilder.toString()

分配并初始化一个新的 String 对象以包含该对象当前表示的字符序列。

嗬!…

    StringBuilder b = new StringBuilder("h");
    b.deleteCharAt( 0 );
    System.out.println( "" == b.toString() ); // prints false

谜团已揭开。

该代码使用 StringBuilder 来处理不断增长的字符串。事实证明,在某些时候有人这样做了:

 public void someAction( String string ) { 
      if( "" == string ) {
           return;
       }

       deleteBankAccount( string );
 }

并使用

 someAction( myBuilder.toString() ); // bug introduced. 

ps 我最近是不是看太多 CodingHorror 了?或者为什么我觉得有必要在这里添加一些有趣的动物图片?


阅读 102

收藏
2022-06-22

共1个答案

小编典典

String s = "";
String s2 = someUserInputVariale.toLowercase(); // where the user entered in ""

这样的事情会导致s == s2评估为假。

许多代码仍然会创建新Strings的而不暴露对new String().

2022-06-22